import * as THREE from 'three';
import { Emitter } from '../Emitter';
import { ParticleSystem } from '../ParticleSystem';
import { EmissionType } from '../shapes/Shape';

/**
 * 法向速度使用示例
 * 展示如何使用不同的法向速度配置来创建各种效果
 */

export function createNormalVelocityExamples() {
    const examples: { name: string, emitter: Emitter }[] = [];

    // 示例1：球体表面爆炸效果 - 固定法向速度
    const sphereExplosionEmitter = new Emitter({
        origin: new THREE.Vector3(-5, 0, 0),
        rate: 200,
        life: 3,
        emitterLife: 1, // 只发射1秒，模拟爆炸
        volecity: new THREE.Vector3(0, 0, 0), // 基础速度为0
        angle: 0,
        size: 3,
        shape: 'sphere',
        shapeParams: { 
            radius: 1,
            emissionType: EmissionType.SURFACE
        },
        normalVelocity: {
            enabled: true,
            speed: 5, // 固定法向速度
        },
        material: new THREE.PointsMaterial({
            size: 3,
            color: 0xff4444,
            transparent: true,
            blending: THREE.AdditiveBlending
        })
    });
    examples.push({ name: '球体爆炸效果', emitter: sphereExplosionEmitter });

    // 示例2：立方体表面发射 - 随机法向速度
    const cubeEmitter = new Emitter({
        origin: new THREE.Vector3(0, 0, 0),
        rate: 100,
        life: 4,
        emitterLife: 10,
        volecity: new THREE.Vector3(0, 1, 0), // 向上的基础速度
        angle: 0,
        size: 2,
        shape: 'box',
        shapeParams: { 
            x: 2, 
            y: 2, 
            z: 2,
            emissionType: EmissionType.SURFACE
        },
        normalVelocity: {
            enabled: true,
            speed:1,
            speedRange: [2, 8], // 随机法向速度范围
        },
        material: new THREE.PointsMaterial({
            size: 2,
            color: 0x44ff44,
            transparent: true,
            blending: THREE.AdditiveBlending
        })
    });
    examples.push({ name: '立方体表面发射', emitter: cubeEmitter });

    // 示例3：使用 BufferGeometry 的复杂模型
    // 创建一个环面几何体
    const torusGeometry = new THREE.TorusGeometry(2, 0.5, 16, 100);
    torusGeometry.computeVertexNormals(); // 确保有法向量数据
    
    const torusEmitter = new Emitter({
        origin: new THREE.Vector3(5, 0, 0),
        rate: 150,
        life: 5,
        emitterLife: 15,
        volecity: new THREE.Vector3(0, 0, 0),
        angle: 0,
        size: 2.5,
        shape: 'bufferGeometry',
        geometry: torusGeometry,
        shapeParams: {
            emissionType: EmissionType.SURFACE
        },
        normalVelocity: {
            enabled: true,
            speed: 3,
            speedRange: [0.8, 1.2] // 轻微的随机变化
        },
        randomVelocity: {
            direction: new THREE.Vector3(0, 1, 0),
            coneAngle: 0.1, // 小锥角添加一些随机性
            speedMin: 0.5,
            speedMax: 1.5
        },
        material: new THREE.PointsMaterial({
            size: 2.5,
            color: 0x4444ff,
            transparent: true,
            blending: THREE.AdditiveBlending
        })
    });
    examples.push({ name: '环面几何体发射', emitter: torusEmitter });

    // 示例4：顶点发射模式
    const icosahedronGeometry = new THREE.IcosahedronGeometry(1.5, 0);
    const vertexEmitter = new Emitter({
        origin: new THREE.Vector3(0, 5, 0),
        rate: 60,
        life: 6,
        emitterLife: 20,
        volecity: new THREE.Vector3(0, 0, 0),
        angle: 0,
        size: 4,
        shape: 'bufferGeometry',
        geometry: icosahedronGeometry,
        shapeParams: {
            emissionType: EmissionType.VERTICES
        },
        normalVelocity: {
            enabled: true,
            speedRange: [4, 7],
            speed: 1
        },
        material: new THREE.PointsMaterial({
            size: 4,
            color: 0xffff44,
            transparent: true,
            blending: THREE.AdditiveBlending
        })
    });
    examples.push({ name: '多面体顶点发射', emitter: vertexEmitter });

    return examples;
}

/**
 * 法向速度配置建议和架构分析
 */
export const NormalVelocityArchitectureNotes = {
    /**
     * 1. 设计方案对比
     */
    architectureComparison: {
        // 方案一：在 Emitter 中管理法向速度（推荐）
        emitterManaged: {
            pros: [
                "统一的速度管理：所有速度分量都在Emitter层统一计算和叠加",
                "配置直观：用户在创建Emitter时就能明确所有速度相关配置",
                "扩展性好：容易添加新的速度类型和组合方式",
                "调试友好：所有速度逻辑集中在一处，便于调试和优化"
            ],
            cons: [
                "Emitter与Shape耦合：需要调用Shape的getRandomNormal方法",
                "配置较复杂：需要理解法向速度的概念和配置选项"
            ]
        },
        
        // 方案二：在 Shape 中管理法向速度
        shapeManaged: {
            pros: [
                "职责明确：Shape负责几何相关的所有计算",
                "Shape自治：每个Shape可以有自己的法向速度计算逻辑"
            ],
            cons: [
                "分散管理：速度分量分散在不同地方，难以统一控制",
                "配置分离：需要在不同地方配置不同的速度参数",
                "调试困难：速度逻辑分散，问题排查复杂"
            ]
        }
    },

    /**
     * 2. 推荐的配置模式
     */
    recommendedPatterns: {
        // 爆炸效果
        explosion: {
            normalVelocity: { enabled: true, speed: 8, multiplier: 1 },
            baseVelocity: "new THREE.Vector3(0, 0, 0)", // 纯法向
            emissionType: "EmissionType.SURFACE"
        },
        
        // 喷泉效果
        fountain: {
            normalVelocity: { enabled: true, speedRange: [2, 5], multiplierRange: [0.8, 1.2] },
            baseVelocity: "new THREE.Vector3(0, 3, 0)", // 向上基础速度 + 法向
            emissionType: "EmissionType.SURFACE"
        },
        
        // 烟花效果
        fireworks: {
            normalVelocity: { enabled: true, speedRange: [5, 12], multiplier: 1 },
            randomVelocity: { coneAngle: 0.2, speedMin: 1, speedMax: 3 }, // 添加随机性
            emissionType: "EmissionType.VERTICES"
        }
    },

    /**
     * 3. BufferGeometry 支持的优势
     */
    bufferGeometryBenefits: [
        "支持任意复杂几何体：可以加载.obj、.gltf等模型文件",
        "精确法向量：使用几何体自带的法向量数据，效果更逼真",
        "多种发射模式：支持从顶点、面、体积发射",
        "高性能：BufferGeometry的属性访问经过优化",
        "易于扩展：可以轻松添加更多几何体类型"
    ],

    /**
     * 4. 使用建议
     */
    usageGuidelines: {
        // 什么时候启用法向速度
        whenToEnable: [
            "需要从物体表面向外发射粒子时",
            "制作爆炸、破碎、喷射等效果时",
            "希望粒子运动方向与几何体形状相关时"
        ],
        
        // 什么时候不启用
        whenToDisable: [
            "从点源或简单几何体中心发射时",
            "需要完全自定义运动方向时",
            "制作环境粒子（如雪花、灰尘）时"
        ],
        
        // 参数调节技巧
        parameterTuning: {
            speed: "控制法向速度的基础大小，影响粒子的初始动能",
            speedRange: "添加随机性，让效果更自然",
            multiplier: "用于微调，不改变随机性的情况下统一缩放",
            multiplierRange: "为法向速度添加微小的随机变化"
        }
    }
};

// 使用示例
/*
const examples = createNormalVelocityExamples();
const particleSystem = new ParticleSystem(examples.map(e => e.emitter));

// 将emitter的points添加到场景
examples.forEach(example => {
    scene.add(example.emitter.points);
});

// 在渲染循环中
function animate() {
    const delta = clock.getDelta();
    particleSystem.update(delta);
    renderer.render(scene, camera);
    requestAnimationFrame(animate);
}
*/